/*
 * app_findPeek.c
 *
 *  Created on: 2023年12月26日
 *      Author: zlw
 */
#include "app_findPeek.h"
#include "app_log.h"

#define CREST_THRESHOLD_CNT     (3) //上升沿大于阈值个数
#define TROUGH_THRESHOLD_CNT    (3) //下降沿小于阈值个数

#define CREST_THRESHOLD         (2500)  //上升沿阈值
#define TROUGH_THRESHOLD        (1000)  //下降沿阈值

#define AVG_VOLTAGE             (1500)  //常态下平均值


static uint16_t crest = 0;  //缓存波峰值
static uint16_t trough = 0; //缓存波谷值

static bool riseState = true;
static bool fallState = true;

/**
 *  @brief: 返回波峰波谷类型；数据是连续的，上次数据会影响下次结果返回
 * @param： *data 数组指针； dataLen 数组长度
 * @return： peekType_t 峰值类型
 * */
peekType_t getPirExtremeValueType(uint16_t *data, uint8_t dataLen)
{
  peekType_t type = peekNone;
  uint8_t i = 0;
  uint16_t greaterCnt = 0;
  uint16_t lessCnt = 0;

  for(i=0; i<dataLen-1;) {
      while(data[i] < data[i+1] && i+1 < dataLen) {
          if(data[i+1] >= CREST_THRESHOLD) {//上升沿大于阈值
              greaterCnt++;
          }
          if(data[i+1] >= AVG_VOLTAGE) {
              riseState = true;
          }
          i++;
      }
      if(i < dataLen-1 &&
          data[i] != crest &&   //峰值不一样，确定不是同一个波峰
          greaterCnt >= CREST_THRESHOLD_CNT &&  //大于阈值的数据个数
          fallState == true) {  //上一个下降沿小于平均值
          type = crestValue;
          fallState = false;
          crest = data[i];
      }
      while(data[i] > data[i+1] && i+1 < dataLen) {
          if(data[i+1] <= TROUGH_THRESHOLD) {//下降沿小于阈值
              lessCnt++;
          }
          if(data[i+1] <= AVG_VOLTAGE) {
              fallState = true;
          }
          i++;
      }
      if(i < dataLen-1 &&
          data[i] != trough &&  //峰值不一样，确定不是同一个波谷
          lessCnt >= TROUGH_THRESHOLD_CNT &&    //小于阈值的数据个数
          riseState == true) {  //上一个上升沿大于平均值
          type = troughValue;
          riseState = false;
          trough = data[i];
      }
  }
  DS_app_log_error("type = 0x%02x \r\n", type);
  return type;
}


